package cn.itcast.serial;


import com.google.gson.Gson;

import java.io.*;
import java.nio.charset.StandardCharsets;

public enum SerializerAlgorithm implements Serializer {
    //Java的序列化及反序列方式
    Java {
        @Override
        public <T> byte[] serialize(T object) {
            System.out.println("使用Java方式序列化");
            // 序列化后的字节数组
            byte[] bytes = null;
            //自动关闭资源
            try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
                 ObjectOutputStream oos = new ObjectOutputStream(bos)) {
                //将对象写入到输出流中
                oos.writeObject(object);
                //转换为字节数组
                bytes = bos.toByteArray();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return bytes;
        }

        @Override
        public <T> T deserialize(Class<T> clazz, byte[] bytes) {
            System.out.println("使用Java方式反序列化");
            T target = null;
            try (ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
                 ObjectInputStream ois = new ObjectInputStream(bis)) {
                //强转
                target = (T) ois.readObject();
            } catch (IOException | ClassNotFoundException e) {
                e.printStackTrace();
            }
            // 返回反序列化后的对象
            return target;
        }
    },
    //Json的序列化的反序列化
    Json {
        @Override
        public <T> byte[] serialize(T object) {
            System.out.println("使用Json方式序列化");
            String s = new Gson().toJson(object);
            // 指定字符集，获得字节数组
            return s.getBytes(StandardCharsets.UTF_8);
        }

        @Override
        public <T> T deserialize(Class<T> clazz, byte[] bytes) {
            System.out.println("使用Json方式反序列化");
            String s = new String(bytes, StandardCharsets.UTF_8);
            // 此处的clazz为具体类型的Class对象，而不是父类Message的
            return new Gson().fromJson(s, clazz);
        }
    }
}